package cn.lan.code.vo;

import cn.lan.code.utils.ConstantUtil;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

/**
 * 返回结果
 * @author lanping
 * @version 1.0
 * @date 2021-08-14
 */
@ApiModel(value = "请求结果", description = "请求结果")
public class Response<T> {

    @ApiModelProperty(value = "返回代码 200成功 其它失败",example = "200")
    private int code;

    @JsonInclude(JsonInclude.Include.NON_NULL)
    @ApiModelProperty("消息")
    private String message;

    @ApiModelProperty(value = "数据")
    private T data;

    @JsonInclude(JsonInclude.Include.NON_NULL)
    @ApiModelProperty(value = "总数")
    private Long total;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public Long getTotal() {
        return total;
    }

    public void setTotal(Long total) {
        this.total = total;
    }

    public Response(int code, T data, long total, String message) {
        this.code = code;
        this.data = data;
        this.total = total;
        this.message = message;
    }

    public Response(int code, T data, long total) {
        this.code = code;
        this.data = data;
        this.total = total;
    }

    public Response(int code, T data, String message) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    public Response(int code, T data) {
        this.code = code;
        this.data = data;
    }

    public Response(int code, String message) {
        this.code = code;
        this.message = message;
    }

    /**
     * 操作成功
     * @param message 消息
     * @return 消息结果
     */
    public static Response message(int code,String message){
        return new Response(code,message);
    }

    /**
     * 操作成功
     * @param message 消息
     * @return 消息结果
     */
    public static Response success(String message){
        return new Response(ConstantUtil.CODE_200,message);
    }

    /**
     * 操作失败
     * @param message 消息
     * @return 消息结果
     */
    public static Response failure(String message){
        return new Response(ConstantUtil.CODE_500,message);
    }

    /**
     * 拒绝访问
     * @param message 消息
     * @return 消息结果
     */
    public static Response forbidden(String message){
        return new Response(ConstantUtil.CODE_403,message);
    }

    /**
     * 参数错误
     * @param message 消息
     * @return 消息结果
     */
    public static Response paramError(String message){
        return new Response(ConstantUtil.CODE_404,message);
    }

    /**
     * authorization过期或为空
     * @param message 消息
     * @return 消息结果
     */
    public static Response authorizationDeny(String message){
        return new Response(ConstantUtil.CODE_403,message);
    }

    /**
     * 返回对象
     * @param data 数据
     * @return 结果对象
     * @param <T> 数据类型
     */
    public static <T> Response<T> data(T data){
        return new Response<T>(ConstantUtil.CODE_200,data);
    }

    /**
     * 返回对象
     * @param data 数据
     * @return 结果对象
     * @param <T> 数据类型
     */
    public static <T> Response<T> data(T data,String message){
        return new Response<T>(ConstantUtil.CODE_200,data,message);
    }

    /**
     * 返回分页查询集合
     * @param data 集合数据
     * @param total 总数
     * @param <T> 数据类型
     * @return 分页结果
     */
    public static <T> Response<T> page(T data, long total){
        return new Response<T>(ConstantUtil.CODE_200,data,total);
    }

    /**
     * 返回分页查询集合
     * @param data 集合数据
     * @param total 总数
     * @param <T> 数据类型
     * @return 分页结果
     */
    public static <T> Response<T> page(T data, long total,String message){
        return new Response<T>(ConstantUtil.CODE_200,data,total,message);
    }

    /**
     * 返回消息
     * @param flag 是否成功
     * @param messagePrefix 消息前缀
     * @return 消息结果
     */
    public static Response<Boolean> message(Boolean flag,String messagePrefix){
        return new Response(ConstantUtil.CODE_200,flag==true?(messagePrefix+"成功"):(messagePrefix+"失败"));
    }
}
